/*
 * Summary: Tree debugging APIs
 * Description: Interfaces to a set of routines used for debugging the tree
 *              produced by the XML parser.
 *
 * Copy: See Copyright for the status of this software.
 *
 * Author: Daniel Veillard
 */

#ifndef __DEBUG_XML__
#define __DEBUG_XML__
#include <stdio.h>
#include <libxml/xmlversion.h>
#include <libxml/tree.h>

#ifdef LIBXML_DEBUG_ENABLED

#include <libxml/xpath.h>

#ifdef __cplusplus
extern "C" {
#endif

/*
 * The standard Dump routines.
 */
XMLPUBFUN void XMLCALL    
    xmlDebugDumpString    (FILE *output,
                 const xmlChar *str);
XMLPUBFUN void XMLCALL    
    xmlDebugDumpAttr    (FILE *output,
                 xmlAttrPtr attr,
                 int depth);
XMLPUBFUN void XMLCALL    
    xmlDebugDumpAttrList    (FILE *output,
                 xmlAttrPtr attr,
                 int depth);
XMLPUBFUN void XMLCALL    
    xmlDebugDumpOneNode    (FILE *output,
                 xmlNodePtr node,
                 int depth);
XMLPUBFUN void XMLCALL
    xmlDebugDumpNode    (FILE *output,
                 xmlNodePtr node,
                 int depth);
XMLPUBFUN void XMLCALL
    xmlDebugDumpNodeList    (FILE *output,
                 xmlNodePtr node,
                 int depth);
XMLPUBFUN void XMLCALL
    xmlDebugDumpDocumentHead(FILE *output,
                 xmlDocPtr doc);
XMLPUBFUN void XMLCALL
    xmlDebugDumpDocument    (FILE *output,
                 xmlDocPtr doc);
XMLPUBFUN void XMLCALL    
    xmlDebugDumpDTD        (FILE *output,
                 xmlDtdPtr dtd);
XMLPUBFUN void XMLCALL    
    xmlDebugDumpEntities    (FILE *output,
                 xmlDocPtr doc);

/****************************************************************
 *                                *
 *             Checking routines            *
 *                                *
 ****************************************************************/

XMLPUBFUN int XMLCALL
    xmlDebugCheckDocument    (FILE * output,
                 xmlDocPtr doc);

/****************************************************************
 *                                *
 *             XML shell helpers            *
 *                                *
 ****************************************************************/

XMLPUBFUN void XMLCALL    
    xmlLsOneNode        (FILE *output, xmlNodePtr node);
XMLPUBFUN int XMLCALL    
    xmlLsCountNode        (xmlNodePtr node);

XMLPUBFUN const char * XMLCALL 
    xmlBoolToText        (int boolval);

/****************************************************************
 *                                *
 *     The XML shell related structures and functions        *
 *                                *
 ****************************************************************/

#ifdef LIBXML_XPATH_ENABLED
/**
 * xmlShellReadlineFunc:
 * @prompt:  a string prompt
 *
 * This is a generic signature for the XML shell input function.
 *
 * Returns a string which will be freed by the Shell.
 */
typedef char * (* xmlShellReadlineFunc)(char *prompt);

/**
 * xmlShellCtxt:
 *
 * A debugging shell context.
 * TODO: add the defined function tables.
 */
typedef struct _xmlShellCtxt xmlShellCtxt;
typedef xmlShellCtxt *xmlShellCtxtPtr;
struct _xmlShellCtxt {
    char *filename;
    xmlDocPtr doc;
    xmlNodePtr node;
    xmlXPathContextPtr pctxt;
    int loaded;
    FILE *output;
    xmlShellReadlineFunc input;
};

/**
 * xmlShellCmd:
 * @ctxt:  a shell context
 * @arg:  a string argument
 * @node:  a first node
 * @node2:  a second node
 *
 * This is a generic signature for the XML shell functions.
 *
 * Returns an int, negative returns indicating errors.
 */
typedef int (* xmlShellCmd) (xmlShellCtxtPtr ctxt,
                             char *arg,
                 xmlNodePtr node,
                 xmlNodePtr node2);

XMLPUBFUN void XMLCALL    
    xmlShellPrintXPathError    (int errorType,
                 const char *arg);
XMLPUBFUN void XMLCALL    
    xmlShellPrintXPathResult(xmlXPathObjectPtr list);
XMLPUBFUN int XMLCALL    
    xmlShellList        (xmlShellCtxtPtr ctxt,
                 char *arg,
                 xmlNodePtr node,
                 xmlNodePtr node2);
XMLPUBFUN int XMLCALL    
    xmlShellBase        (xmlShellCtxtPtr ctxt,
                 char *arg,
                 xmlNodePtr node,
                 xmlNodePtr node2);
XMLPUBFUN int XMLCALL    
    xmlShellDir        (xmlShellCtxtPtr ctxt,
                 char *arg,
                 xmlNodePtr node,
                 xmlNodePtr node2);
XMLPUBFUN int XMLCALL    
    xmlShellLoad        (xmlShellCtxtPtr ctxt,
                 char *filename,
                 xmlNodePtr node,
                 xmlNodePtr node2);
#ifdef LIBXML_OUTPUT_ENABLED
XMLPUBFUN void XMLCALL    
    xmlShellPrintNode    (xmlNodePtr node);
XMLPUBFUN int XMLCALL    
    xmlShellCat        (xmlShellCtxtPtr ctxt,
                 char *arg,
                 xmlNodePtr node,
                 xmlNodePtr node2);
XMLPUBFUN int XMLCALL    
    xmlShellWrite        (xmlShellCtxtPtr ctxt,
                 char *filename,
                 xmlNodePtr node,
                 xmlNodePtr node2);
XMLPUBFUN int XMLCALL    
    xmlShellSave        (xmlShellCtxtPtr ctxt,
                 char *filename,
                 xmlNodePtr node,
                 xmlNodePtr node2);
#endif /* LIBXML_OUTPUT_ENABLED */
#ifdef LIBXML_VALID_ENABLED
XMLPUBFUN int XMLCALL    
    xmlShellValidate    (xmlShellCtxtPtr ctxt,
                 char *dtd,
                 xmlNodePtr node,
                 xmlNodePtr node2);
#endif /* LIBXML_VALID_ENABLED */
XMLPUBFUN int XMLCALL    
    xmlShellDu        (xmlShellCtxtPtr ctxt,
                 char *arg,
                 xmlNodePtr tree,
                 xmlNodePtr node2);
XMLPUBFUN int XMLCALL    
    xmlShellPwd        (xmlShellCtxtPtr ctxt,
                 char *buffer,
                 xmlNodePtr node,
                 xmlNodePtr node2);

/*
 * The Shell interface.
 */
XMLPUBFUN void XMLCALL    
    xmlShell        (xmlDocPtr doc,
                 char *filename,
                 xmlShellReadlineFunc input,
                 FILE *output);
             
#endif /* LIBXML_XPATH_ENABLED */

#ifdef __cplusplus
}
#endif

#endif /* LIBXML_DEBUG_ENABLED */
#endif /* __DEBUG_XML__ */
